/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.Flags.Flag;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;
import log.ExpertoLog;

/**
 *
 * @author Leandro
 */
public class ExpertoMail {

    
    
    private Properties prop = new Properties();
    private Session session;

    public void configurate(boolean tls,boolean ssl,int puerto){

        // Configuramos TLS
        String TLS;
        if(tls){
            TLS="true";
        }else{
            TLS="false";
        }
        prop.setProperty("mail.pop3.starttls.enable", TLS);

        if(ssl){
        // Hay que usar SSL
            prop.setProperty("mail.pop3.socketFactory.class","javax.net.ssl.SSLSocketFactory" );
            prop.setProperty("mail.pop3.socketFactory.fallback", "false");
        }

        // Puerto para conectarse.
        prop.setProperty("mail.pop3.port",""+puerto);
        prop.setProperty("mail.pop3.socketFactory.port", ""+puerto);

        session = Session.getInstance(prop);
        session.setDebug(true);
    }

    public List<Mensaje> getMessages(String server,String usr,String pass){
            List<Mensaje> rta = new ArrayList<Mensaje>();
            Mensaje aux;
            Store store = null;
            if (session != null) {
                try {
                    store = session.getStore("pop3");
                    SuscriptorLog.getInst().notificar("#Obtuve la sesión");
                    ExpertoLog.logger.debug("Obtuvimos la sesion");
                    
                } catch (NoSuchProviderException ex) {
                    SuscriptorLog.getInst().notificar("#Excepción no se encontro ese proveedor:" + ex.getMessage());
                    ExpertoLog.logger.error("#Excepción no se encontro ese proveedor",ex);
                }
                try {
            store.connect(server, usr, pass);
            SuscriptorLog.getInst().notificar("#Conexion establecida");
            ExpertoLog.logger.debug("#Conexion establecida");
            Folder folder = store.getFolder("INBOX");
            folder.open(Folder.READ_WRITE);
            if(folder.getMessageCount()>0){
            for(Message m:folder.getMessages()){
                    try {
                        m.setFlag(Flag.DELETED, true);
                        aux = new Mensaje(m.getFrom()[0].toString(), m.getContent().toString());
                        rta.add(aux);
                    } catch (IOException ex) {
                        Logger.getLogger(ExpertoMail.class.getName()).log(Level.SEVERE, null, ex);
                        ExpertoLog.logger.error("#Error de IO leyendo el mensaje",ex);
                    } catch (MessagingException ex) {
                        Logger.getLogger(ExpertoMail.class.getName()).log(Level.SEVERE, null, ex);
                        ExpertoLog.logger.error("#Error de Messaging leyendo el mensaje",ex);
                    }
                
            }
            }else{
                ExpertoLog.logger.debug("No hay mensajes en el servidor");
                SuscriptorLog.getInst().notificar("No hay mensajes en el servidor");
            }

            folder.close(true);
                }
            catch (MessagingException ex) {
                Logger.getLogger(ExpertoMail.class.getName()).log(Level.SEVERE, null, ex);
                SuscriptorLog.getInst().notificar("#Excepción al tratar de leer los mensajes:"+ex.getMessage());
                ExpertoLog.logger.error("#Excepción al tratar de leer los mensajes:",ex);
            }catch(Exception e){
                ExpertoLog.logger.error("#Excepción al tratar de conectar:",e);
            }finally{
                try {

                    if(store.isConnected()){
                        store.close();
                        SuscriptorLog.getInst().notificar("#Desconectando");
                        ExpertoLog.logger.debug("#Sesion desconectada");
                    }
                } catch (MessagingException ex) {
                    Logger.getLogger(ExpertoMail.class.getName()).log(Level.SEVERE, null, ex);
                    SuscriptorLog.getInst().notificar("#No pude desconectar");
                    ExpertoLog.logger.error("#Excepcion desconectando la session",ex);
                }
            }
            } else {
                SuscriptorLog.getInst().notificar("#No habia una sesión iniciada");
                ExpertoLog.logger.debug("#No habia una sesión iniciada");
            }
            
            return rta;
    }

}
